package xx.services.demo.rest;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.sql.RowSet;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;

import xx.entity.demo.DemoList;
import xx.entity.demo.DemoParam;
import xx.services.Passport;
import xx.services.demo.inter.IListInterface;
import xx.services.util.Constants;
import xx.util.Arr;
import xx.util.string.Format;

/**
 * 布局中List列表服务接口
 * 
 * @Path (Constants.RESTFUL_ROOT_PATH + "/demo/list")
 * @author Administrator 2010-12-20
 */
@Path(Constants.RESTFUL_ROOT_PATH + "/demo/list")
public class ListRest extends Passport implements IListInterface
{

    public ListRest(@Context
    HttpServletRequest request)
    {
        super(request);
        // TODO Auto-generated constructor stub
    }

    /**
     * 新增一个列表demo。<br>
     * 
     * @POST
     * @param title-@FormParam("title")
     *            列表标题
     * @param container-@FormParam("container")
     *            列表容器，一般是一个div，如：<div class="container">${container}</div>
     * @param templet-@FormParam("templet")
     *            列表行模板
     * @param demo-@FormParam("demo")
     *            列表demo实例
     * @param shape-@FormParam("shape")
     *            列表图片样子
     * @param description-@FormParam("description")
     *            列表描述
     * @param sign-@FormParam("sign")
     * @param clazz-@FormParam("clazz")
     *            列表对应的实体class名称，<br>
     *            如：评论列表对应comment，回复列表对应reply，文章列表、文档列表、相册列表等从Entity继承过来的都对应entity。<br>
     *            注：从Entity继承过来的必须通过sign来区分，其他的如回复reply的sign为0.
     * @return 新列表实体对象
     * @author chenxiang
     */
    @POST
    public String add(@FormParam("title")
    String title, @FormParam("container")
    String container, @FormParam("templet")
    String templet, @FormParam("demo")
    String demo, @FormParam("shape")
    String shape, @FormParam("description")
    String description, @FormParam("sign")
    int sign, @FormParam("clazz")
    String clazz)
    {
        try
        {
            DemoList dl = new DemoList(qr, owner);
            dl.setTitle(title).setContainer(container);
            dl.setTemplet(templet);
            dl.setDemo(demo).setShape(shape).setDescription(description);
            dl.setSign(sign).setClazz(clazz);
            long listId = dl.insert();

            // 自动插入默认的参数值
            DemoParam dp = new DemoParam(qr, owner);
            dp.setListId(listId).setPagesize(Constants.PAGESIZE_DEFAULT).setPageno(
                    Constants.PAGENO_DEFAULT);
            dp.insert();

            return ok(dl);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return error(e);
        }
    }

    /**
     * 删除列表demo。<br>
     * 
     * @DELETE
     * @Path ("/{list_id}")
     * @param listId-@PathParam("list_id")
     *            列表ID，多个ID用“_”隔开
     * @return true-删除成功，string-其他删除失败（string就是失败原因）
     * @author chenxiang
     */
    @DELETE
    @Path("/{list_id}")
    public String delete(@PathParam("list_id")
    String listId)
    {
        try
        {
            long[] listIdArr = Arr.toLongArray(listId, "_");
            int count = 0;
            for (long id : listIdArr)
            {
                DemoList dl = new DemoList(qr, owner);
                dl.setListId(id);
                dl.delete();
                count++;
            }
            return ok(count);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return error(e);
        }
    }

    /**
     * 获取一个列表demo。 <br>
     * 
     * @GET
     * @Path ("/{list_id}")
     * @param listId-@PathParam("list_id")
     *            列表ID
     * @return list列表实体
     * @author chenxiang
     */
    @GET
    @Path("/{list_id}")
    public String get(@PathParam("list_id")
    long listId)
    {
        try
        {
            DemoList dl = new DemoList(qr, owner);
            dl.setListId(listId);
            dl.load();
            return ok(dl);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return error(e);
        }
    }

    /**
     * 获取list列表。<br>
     * 
     * @GET
     * @param sign-@QueryParam("sign")
     *            sign标志，当sign小于0时获取全部
     * @param clazz-@QueryParam("clazz")
     *            列表对应的class名称，当clazz为null时表示获取全部
     * @return 一组list列表实体
     * @author chenxiang
     */
    @GET
    public String gets(@QueryParam("sign")
    int sign, @QueryParam("clazz")
    String clazz)
    {
        try
        {
            DemoList dl = new DemoList(qr, owner);

            StringBuilder cond = new StringBuilder();

            if (sign > 0)
            {
                cond.append(DemoList.SIGN).append("=").append(sign);
            }

            if (!Format.isEmpty(clazz))
            {
                cond.append(cond.length() > 0 ? " AND " : "").append(DemoList.CLAZZ).append("=")
                        .append(clazz);
            }

            if (!Format.isEmpty(condition))
            {
                cond.append(cond.length() > 0 ? " AND " : "").append("(").append(condition).append(
                        ")");
            }

            RowSet rs = dl.getList(pageSize, pageNo, cond.toString(), orderField, fields);
            Map<String, Object> map = new HashMap<String, Object>();
            if (isTotal)
            {
                map.put(Constants.TOTAL, dl.getCount(cond.toString()));
            }
            return ok(dl.rsToList(rs), map);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return error(e);
        }
    }

    /**
     * 获取list对应的参数列表。<br>
     * 注：增加成功后要自动增加一条默认的参数(param)
     * 
     * @Path ("/{list_id}/param")
     * 
     * @param listId-@PathParam("list_id")
     *            列表ID
     * @return 参数实体
     * @author chenxiang
     */
    @GET
    @Path("/{list_id}/param")
    public String getParam(@PathParam("list_id")
    long listId)
    {
        try
        {
            DemoParam dp = new DemoParam(qr, owner);
            dp.setListId(listId).load();
            return ok(dp);
        }
        catch (SQLException e)
        {
            return error(e);
        }
    }

    /**
     * 修改一个列表demo。<br>
     * 
     * @PUT
     * @Path ("/{list_id}")
     * @param listId-@PathParam("list_id")
     *            列表ID
     * @param title-@FormParam("title")
     *            列表标题
     * @param container-@FormParam("container")
     *            列表容器，一般是一个div，如：<div class="container">${container}</div>
     * @param templet-@FormParam("templet")
     *            列表行模板
     * @param demo-@FormParam("demo")
     *            列表demo实例
     * @param shape-@FormParam("shape")
     *            列表图片样子
     * @param description-@FormParam("description")
     *            列表描述
     * @param sign-@FormParam("sign")
     * @param clazz-@FormParam("clazz")
     *            列表对应的实体class名称，<br>
     *            如：评论列表对应comment，回复列表对应reply，文章列表、文档列表、相册列表等从Entity继承过来的都对应entity。<br>
     *            注：从Entity继承过来的必须通过sign来区分，其他的如回复reply的sign为0.
     * @return 新列表实体对象
     * @author chenxiang
     */
    @PUT
    @Path("/{list_id}")
    public String update(@PathParam("list_id")
    long listId, @FormParam("title")
    String title, @FormParam("container")
    String container, @FormParam("templet")
    String templet, @FormParam("demo")
    String demo, @FormParam("shape")
    String shape, @FormParam("description")
    String description, @FormParam("sign")
    int sign, @FormParam("clazz")
    String clazz)
    {
        try
        {
            DemoList dl = new DemoList(qr, owner);
            dl.setListId(listId);
            StringBuilder condition = new StringBuilder();
            if (title != null && !"".equals(title.trim()))
            {
                condition.append("title,");
                dl.setTitle(title);
            }
            if (container != null && !"".equals(container.trim()))
            {
                condition.append("container,");
                dl.setContainer(container);
            }
            if (templet != null && !"".equals(templet.trim()))
            {
                condition.append("templet,");
                dl.setTemplet(templet);
            }
            if (demo != null && !"".equals(demo.trim()))
            {
                condition.append("demo,");
                dl.setDemo(demo);
            }
            if (shape != null && !"".equals(shape.trim()))
            {
                condition.append("shape,");
                dl.setShape(shape);
            }
            if (description != null && !"".equals(description.trim()))
            {
                condition.append("description,");
                dl.setDescription(description);
            }
            if (sign > 0)
            {
                condition.append("sign,");
                dl.setSign(sign);
            }
            if (clazz != null && !"".equals(clazz.trim()))
            {
                condition.append("clazz,");
                dl.setClazz(clazz);
            }
            if (condition.length() > 0)
            {
                dl.update(condition.toString());
            }
            else
            {
                dl.update();
            }
            return ok(dl);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return error(e);
        }
    }
}
